package com.beauty.order.service;

import com.beauty.order.dto.OrderRequest;
import com.beauty.order.dto.OrderResponse;
import com.beauty.order.dto.PageResponse;
import com.beauty.order.entity.Order;
import com.fasterxml.jackson.core.JsonProcessingException;
import org.springframework.data.domain.Pageable;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单服务接口
 * 
 * 定义了订单管理相关的业务操作，包括创建、查询、更新和删除订单
 */
public interface OrderService {

    /**
     * 创建新订单
     * 
     * @param orderRequest 订单请求DTO，包含创建订单所需的所有信息
     * @return 创建成功的订单响应DTO
     * @throws JsonProcessingException 当JSON处理出错时抛出
     */
    OrderResponse createOrder(OrderRequest orderRequest) throws JsonProcessingException;

    /**
     * 根据ID获取订单
     * 
     * @param id 订单ID
     * @return 订单响应DTO
     */
    OrderResponse getOrderById(Long id);

    /**
     * 根据订单号获取订单
     * 
     * @param orderNumber 订单号
     * @return 订单响应DTO
     */
    OrderResponse getOrderByOrderNumber(String orderNumber);

    /**
     * 获取指定客户的所有订单
     * 
     * @param customerId 客户ID
     * @return 订单响应DTO列表
     */
    List<OrderResponse> getOrdersByCustomerId(String customerId);
    
    /**
     * 通过订单号更新订单状态
     * 
     * @param orderNumber 订单号
     * @param status 状态
     * @return 更新后的订单实体
     */
    Order updateOrderStatusByOrderNumber(String orderNumber, String status);
    
    /**
     * 获取指定状态的所有订单
     * 
     * @param status 订单状态
     * @return 订单响应DTO列表
     */
    List<OrderResponse> getOrdersByStatus(Order.OrderStatus status);

    /**
     * 获取指定日期范围内的所有订单
     * 
     * @param start 开始日期时间
     * @param end 结束日期时间
     * @return 订单响应DTO列表
     */
    List<OrderResponse> getOrdersByDateRange(LocalDateTime start, LocalDateTime end);

    /**
     * 获取所有订单
     * 
     * @return 订单响应DTO列表
     */
    List<OrderResponse> getAllOrders();

    /**
     * 更新订单状态
     * 
     * @param id 订单ID
     * @param status 新的订单状态
     * @return 更新后的订单响应DTO
     */
    OrderResponse updateOrderStatus(Long id, Order.OrderStatus status);

    /**
     * 更新订单的物流跟踪号
     * 
     * @param id 订单ID
     * @param trackingNumber 物流跟踪号
     * @return 更新后的订单响应DTO
     */
    OrderResponse updateTrackingNumber(Long id, String trackingNumber);

    /**
     * 删除订单
     * 
     * @param id 要删除的订单ID
     */
    void deleteOrder(Long id);

    /**
     * 分页获取所有订单
     * 
     * @param pageable 分页参数
     * @return 包含订单响应DTO的分页响应
     */
    PageResponse<OrderResponse> getOrdersPage(Pageable pageable);

    /**
     * 分页获取指定客户的订单
     * 
     * @param customerId 客户ID
     * @param pageable 分页参数
     * @return 包含订单响应DTO的分页响应
     */
    PageResponse<OrderResponse> getOrdersByCustomerIdPage(String customerId, Pageable pageable);

    /**
     * 分页获取指定状态的订单
     * 
     * @param status 订单状态
     * @param pageable 分页参数
     * @return 包含订单响应DTO的分页响应
     */
    PageResponse<OrderResponse> getOrdersByStatusPage(Order.OrderStatus status, Pageable pageable);

    /**
     * 分页获取指定日期范围内的订单
     * 
     * @param start 开始日期时间
     * @param end 结束日期时间
     * @param pageable 分页参数
     * @return 包含订单响应DTO的分页响应
     */
    PageResponse<OrderResponse> getOrdersByDateRangePage(LocalDateTime start, LocalDateTime end, Pageable pageable);

    /**
     * 关键字搜索订单
     * 
     * @param keyword 搜索关键字
     * @param pageable 分页参数
     * @return 包含订单响应DTO的分页响应
     */
    PageResponse<OrderResponse> searchOrders(String keyword, Pageable pageable);

    /**
     * 高级搜索订单
     * 
     * @param orderNumber 订单号
     * @param customerId 客户ID
     * @param trackingNumber 物流跟踪号
     * @param notes 订单备注
     * @param shippingAddress 配送地址
     * @param pageable 分页参数
     * @return 包含订单响应DTO的分页响应
     */
    PageResponse<OrderResponse> advancedSearch(String orderNumber, String customerId,
                                             String trackingNumber, String notes,
                                             String shippingAddress, Pageable pageable);

    /**
     * 通过ID获取订单实体
     * 
     * @param id 订单ID
     * @return 订单实体对象
     */
    Order getOrderByIdEntity(Long id);
}